package com.math;

import org.junit.Test;

import java.math.BigDecimal;

/**
 * @Description
 * 不能使用 double类型的构造函数，可以使用字符串的构造方法替代
 * 不能使用equal，可以使用compareTo方法
 * @Author away
 * @Version V1.0.0
 * @Since 1.0
 * @Date 2019/10/28
 */
public class BigDecimalDemo {

    /**
     * 初始化结束后对象实际使用的是 stringCache（保留原始字符串）和 scale（字符串后n位为小数位）。如使用字符串 "2.1"初始化BigDecimal时 stringCache="21"，scale为 1。
     * warn 不可以使用double或者float初始化BigDecimal会出现精度问题。
     */
    @Test
    public void constructTest(){
        double d = 2.1;
        String s1 = "2.1";
        String s2 = "2.10";
        BigDecimal b1 = new BigDecimal(d);//实际初始化后为 2.100000000000000088817841970012523233890533447265625，会影响之后的计算内容
        BigDecimal b2 = BigDecimal.valueOf(d);//会将double转化为String后再进行初始化
        BigDecimal b3 = new BigDecimal(s1);
        BigDecimal b4 = new BigDecimal(s2);//此时stringCache为210，scale为 2。使用equal时会比较scale所以为错误，需要使用compareTo

        System.out.println(b1.equals(b2));//false
        System.out.println(b2.equals(b3));//true
        System.out.println(b2.equals(b4));//false
        System.out.println(b2.compareTo(b4));//0

        System.out.println("b1:" + b1.toString());
        System.out.println("b2:" + b2.toString());
        System.out.println("b4:" + b4.toString());
    }



    @Test
    public void test(){
        Double result = 0.0;
        try {
            BigDecimal add = new BigDecimal(0);
            BigDecimal tmp = new BigDecimal("0.05");

            BigDecimal tt =  add.add(tmp);
            System.out.println(add);
            System.out.println(tt);
        }catch (Exception e){
            e.printStackTrace();
        }
    }

    /**
     * 四舍五入
     */
    @Test
    public void test01(){
        BigDecimal s = new BigDecimal(1.0*3 / 8);
        System.out.println(s);

        BigDecimal t = new BigDecimal("1.3456");
        String ss = t.setScale(2, BigDecimal.ROUND_HALF_UP).toString();
        System.out.println(ss);
    }
}
